package com.gec.component;

import com.gec.dao.MenuDao;
import com.gec.domain.Permission;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PermissionDataFactory {

    @Autowired
    private MenuDao menuDao;
    private Map<String, String> definitions = new LinkedHashMap();
    private String regex = "\\s*([^\\s]+)\\s*=\\s*([^\\s]+)\\s*";

    //这个方法用来: 裁切掉哪些多余的空格。
    //并取出相应的数据。
    //把下面的字符串中多余的空格拿掉, 获取里面的值。
    //例句: "     /Common/showLogin    =     anon    "
    private String[] trimSpace(
            String line, String regex) {
        Pattern pat = Pattern.compile(regex);
        Matcher mat = pat.matcher(line);
        String[] ret = new String[2];
        if (mat.matches()) {
            ret[0] = mat.group(1);
            ret[1] = mat.group(2);
        }
        return ret;
    }

    //{B}设置我要放行的哪些映射地址(过滤器)。
    //   即不在数据库中设置的映射地址。(在这里进行设置。)
    public void setAnonymousFilter(
            String definition) {
        String[] parts = definition.split("\n");
        String[] ret;
        System.out.println("+-----------------匿名过滤器设置--------------------+");
        for (String L : parts) {
            L = L.trim();   //这里记住要 trim 一下。
            if (L.length() > 0) {
                ret = trimSpace(L, regex);
                //{2}存入映射地址 + anon 到 map 中。
                definitions.put(ret[0], ret[1]);
                System.out.printf("[%s]:[%s]\n",
                        ret[0], ret[1]);
            }
        }
        System.out.println("+------------------------------------------------+");
    }

    //{PS}getFilterDefinitions (工厂方法)
    //这里产生的数据即是另一个 Bean.(以后要设置到 Shiro 过滤链Map上)
    //对外提供数据, 给另外一个 Bean 使用
    public Map getFilterDefinitions() {
        //{1}我们已经在上面方法中存入了一部分过滤器 [anon]
        //{2}这里还有其它的过滤器要存入进来
        //   a. 权限过滤器
        //   /User/edit = perms[user:edit]
        //   b. 认证过滤器 authc
        //   /** = authc
        //{3}通过这个方法取出系统所有的权限信息
        Set<Permission> perms = menuDao.getSysPermission();
        //3.1 一个 Permission 包含 /User/edit + user:edit
        Iterator<Permission> it = perms.iterator();
        while (it.hasNext()) {
            Permission P = it.next();
            String perm = P.getPermission();
            String filter = "perms[" + perm + "]";
            String mapping = P.getMapping();
            //           /User/edit  | perms[标识符]
            definitions.put(mapping, filter);
        }
        //{4}认证过滤器 authc
        definitions.put("/**", "authc");
        //{5}返回这个 Map { 映射地址 + 过滤器[权限标识符] }
        return definitions;
    }

    public static void main(String[] args) {
        PermissionDataFactory F = new PermissionDataFactory();
        String L = "\t  \t   /Common/showLogin " +
                "  =     anon1  \t  \n" +
                "\t  \t   /Common/register " +
                "  =     anon2  \t  \n" +
                "\t  \t   /Common/view " +
                "  =     anon3  \t  \n\n";

        //F.trimSpace(L , F.regex);
        //{1}设置匿名访问过滤器。
        F.setAnonymousFilter(L);
    }


}
